#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <sstream>
#include "fun.h"
using namespace std;

////////////////////////////////// Zmienne globalne ////////////////////////////////////
string Tdialogi[5];   //Tablica globalna dialogów                  [0] - nr linii, [1] - ID, [2] - osoba, [3] - treść oryg., [4] - treść tum.
string Topcjadial[4]; //Tablica globalna opcji dialogowych         [0] - nr linii, [1] - ID, [2] - treść.
string Tdopcjadial[4]; //Tab. glob. dynamicznych opcji dialogowych [0] - nr linii, [1] - ID, [2] - treść.
string Tlog[4];       //Tablica globalna dziennika                 [0] - nr linii, [1] - ID, [2] - treść.
string ***Ttdialogi;


/////////////////////////////////////////
template <typename T>             //
string toStr(const T& x)          //
{                                 //
      std::ostringstream oss;     // funkcja zmieniająca int na string.
      oss << x;                   //
      return oss.str();           //
}                                 //
////////////////////////////////////////

//////////////////////////////// Główny program ///////////////////////////////
int main(int argc, char *argv[])
{
//------------------ Wypisuje nazwę programu i wczytane parametry. --------------------

    cout << "Nazwa programu: " << argv[0] << endl //Odczytanie nazwy programu.
	<< "Ilość argumentów: " << argc << endl;      //Odczytanie ilości wprowadzonych parametrów.

	for(int i = 1; i < argc; i++)
	{
		cout << "Parametr nr. " << i << " to: " << argv[i] << endl;   // Wypisuje wprowadzone parametry.
	}

/////////////////////////////////////// Zmienne lokalne //////////////////////////////////////

/////////////////////////////////////// Zmienne plikowe //////////////////////////////////////
    fstream Strm;   //Zmienna plikowa pliku wejściowego
    fstream wyjsc;  //Zmienna plikowa pliku wyjściowego
    fstream lista;  //Zmienna plikowa listy skryptów.
    fstream zplik2; //Zmienna plikowa drugiego pliku wejściowego.

//////////////////////////////////////// Blokady /////////////////////////////////////////////

    int blokada = 1;

////////////////////////////////////// Liczniki //////////////////////////////////////////////

    int ldesc =0;         //Licznik opcji wyboru.
    int lout =0;          //Licznik dialogów.
    int looth = 0;        //Licznik dialogów Bohatera.
    int losel = 0;        //Licznik dialogów NPC.
    int laddc = 0;        //Licznik polecenia Info_AddChoice.
    int llog = 0;         //Licznik logów.
    int linia =0;         //Licznik linii.
    int lliwiersz = 0;    //Licznik wierszy w pliku listy skryptów.
    int prelliwiersz = 0; //Licznik wierszy w pliku listy skryptów.
    int Ldialog = 0;   //Licznik dialogów.
    int Lopcdial = 0;  //Licznik opcji dialogowych.
    int Laopcdial = 0; //Licznik dynamicznych opcji dialogowych.
    int Llog = 0;      //Licznik logów.
    int lipol =0;

/////////////////////////////////// Bufory ////////////////////////////////////

    char Znak2;
    char Znak;                         //Zmienna wczytywanego znaku, bufor.

/////////////////////////////////////////////////////////////////////////////////////

    char org[] = "org/content/";
    char tlum[] = "tlum/";

////////////////////////////////// Tablice dynamiczne ///////////////////////////////

    char **plik;
    char **plik2;
    char **wynik;
    char *Tdom;

    int *Tilosc;

////////////////////////////////// Strumienie ///////////////////////////////////////

    string pl= "";
    string dom = "/home/lmviii/Projekty/cpp/gtt4/";
    string tlum2 = "/home/lmviii/Projekty/cpp/tlum/";
    string spr= "";
    string spr2="";
    string liwiersz="";
    string lidwiersz="";
    string Skat="";
    string Dtemp;

///////// Dynamiczna tablica katalogu domowego /////////

    Tdom = new char[dom.length() +1];
    strcpy(Tdom,dom.c_str());


///////////////////////////////////////// Warunki parametrów ////////////////////

    if (argv[1]!=0)spr2=argv[1];

    if (argv[2] != 0)
    {
        spr=argv[2];
    }
    if (argv[1] != 0&& spr=="")
    {
        string dupa = argv[1];
//        plik = new char[ dupa.length() + 1 ];
//        strcpy( plik, dupa.c_str() );
        }
    else if (spr=="-p")
    {
        pl=spr;
        string dupa = dom + argv[1];
//        plik = new char[ dupa.length() + 1 ];
//        strcpy( plik, dupa.c_str() );

    }
    else if (spr2 == "-p")
    {
        pl=spr2;
        string dupa = argv[2];
//        plik = new char[ dupa.length() + 1 ];
//        strcpy( plik, dupa.c_str() );

    }
/*    else if (spr=="-d")
    {
        pl=spr;
        string dupa = dom + argv[1];
        plik = new char[dupa.length()+1];
        strcpy( plik, dupa.c_str() );

        string dupa2 = tlum + argv[1];
        plik2 = new char[dupa2.length()+1];
        strcpy(plik2,dupa2.c_str());

    }
    */
    else
    {
//        plik="tempskrypt.d";

    }


//       char wynik[]="/home/lmviii/Projekty/cpp/wyjście.txt";
//    if (pl=="-d") zplik2.open(plik2);



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////Operacje na liście/////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    lista.open("lista.txt");        //Otwarcie pliku

    if (!lista.is_open()) return 1; //Sprawdzenie czy się udało

    //if ( !Strm.is_open( ) ) return 1;
    //if ( !wyjsc.is_open( ) ) return 1;

///////////////////////////// Liczenie pozycji ////////////////////////////////

    lista >> noskipws >> Znak;
    while (!lista.eof())
    {
        //cout << Znak;
        while (Znak!='\n'&&Znak!='\r')
        {
            lidwiersz=lidwiersz+Znak;
            lista >> Znak;
        }
    if (Znak=='\n'&&lidwiersz!="") prelliwiersz++;
    lidwiersz="";
    lista >> Znak;
    }
///////////////////////////////////////////////////////////////////////////////

    lista.close(); //Zamknięcie pliku listy

    cout << prelliwiersz; // Wypisuje ilość elementów listy

    plik = new char*[prelliwiersz+1];
    wynik = new char*[prelliwiersz+1];
    plik2 = new char*[prelliwiersz+1];
    Ttdialogi = new string**[prelliwiersz+1];
    Tilosc = new int[prelliwiersz+1];
    //cout << prelliwiersz;

    lista.open("lista.txt"); //Otwarcie pliku listy

///////////////////////////// Czytanie treści ////////////////////////////////
    lista >> noskipws >> Znak;
    while (!lista.eof())
    {
        //cout << Znak;
        while (Znak!='\n'&&Znak!='\r')
        {
            for (int i =0; i<(dom.length()+1)&&Znak!='\n'&&Znak!='\r';)
            {
                if (tolower(Znak)==tolower(Tdom[i]))
                {
                    lidwiersz=lidwiersz+Znak;
                    lista >> Znak;
                    i++;
                }
                else
                {
                    liwiersz=liwiersz+lidwiersz;
                    lidwiersz="";
                    break;
                }
                if (i==dom.length())
                {
                    //cout << lidwiersz << i << endl;
                    lidwiersz="";
                    lliwiersz++;
                    for (int i1=0, i2=0; i1<12||i2<5;)
                    {
                        if(tolower(Znak)==org[i1])
                        {
                            Skat=Skat+Znak;
                            lista>>Znak;
                            i1++;
                        }
                        else if (tolower(Znak)==tlum[i2])
                        {
                            Skat=Skat+Znak;
                            lista>>Znak;
                            i2++;
                        }
                        else
                        {
                            liwiersz=liwiersz+Skat;
                            Skat="";
                            break;
                        }
                        if (i1==12||i2==5) Skat="";
                    }
                }
            }
        liwiersz=liwiersz+Znak;
        lista >> Znak;
        }
        cout << liwiersz << endl;

        //lista >> Znak;
        string dupa = dom + "org/Content/" + liwiersz;
        //string dupa = dom + "tlum/" + liwiersz;
        ////////////////////
        plik[lliwiersz] = new char[dupa.length() + 1];   //
        strcpy( plik[lliwiersz], dupa.c_str() );

        string dupa3 = dom + "tlum/Content/" + liwiersz;
        plik2[lliwiersz] = new char[dupa3.length() +1];
        strcpy (plik2[lliwiersz], dupa3.c_str());

        string dupa2 = dom + "wynik/Content/" + liwiersz + ".po";
        wynik[lliwiersz] = new char[dupa2.length() +1];
        strcpy(wynik[lliwiersz],dupa2.c_str());




        Strm.open(plik[lliwiersz]);

        zplik2.open(plik2[lliwiersz]);
        cout << plik[lliwiersz]<<endl;
        cout << plik2[lliwiersz]<<endl;
        //cout <<lliwiersz;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////Operacje na skrypcie////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

        Strm >> noskipws >> Znak; //Wczytuje znak po znaku uwzględniając białe znaki.
        zplik2 >> noskipws >> Znak2;
        //while ( Strm.good( )&& wyjsc.good() )
        //{


///////////////////////////////////////// Liczenie poleceń /////////////////////////////////////////////////


        while (!Strm.eof())
        {
            findAiOutput (Strm,Znak,linia,lout,looth,losel,Ldialog,Tdialogi,1); // Zlicza dialogi.
            findDialoge (Strm,Znak,linia,ldesc,Lopcdial,Topcjadial,1);          // Zlicza opcje dialogowe.
            findAddChoice (Strm,Znak,linia,laddc,Laopcdial,Tdopcjadial,1);      // Zlicza Dynamiczne opcje dialogowe.
            findLogEntry(Strm,Znak,Tlog,linia,llog,Llog,1);                     // Zlicza logi.

            Strm >> Znak;
        }

        Strm.close();
        zplik2.close();

        //cout << lliwiersz;
        Ttdialogi[lliwiersz] = new string*[Ldialog+Lopcdial+Laopcdial+Llog+2];
        for (int n=0;n<(Ldialog+Lopcdial+Laopcdial+Llog+2);n++)
        {
            Ttdialogi[lliwiersz][n] = new string[7];
        }

        Strm.open(plik[lliwiersz]);
        zplik2.open(plik2[lliwiersz]);
        if (0<(Ldialog+Lopcdial+Laopcdial+Llog)) wyjsc.open(wynik[lliwiersz], ios::out);




        //if (argv[1] != 0&&argv[2] !=0) wyjsc << argv[1] << " ilość " << argc << " " << argv[2] <<endl;
        //wyjsc << bplik;
        wyjsc << "# dfgdfg" << endl;
        wyjsc << "# lmviii <burak326@o2.pl>, 2010." << endl;
        wyjsc << "#, fuzzy" << endl;
        wyjsc << "msgid \"\"" << endl;
        wyjsc << "msgstr \"\"" << endl;
        wyjsc << "\"Project-Id-Version: fdgsdfg\\n\"" << endl;
        wyjsc << "\"Report-Msgid-Bugs-To: dupa@dupa.pl\\n\"" << endl;
        wyjsc << "\"POT-Creation-Date: 2010-03-27 22:44+0100\\n\"" << endl;
        wyjsc << "\"PO-Revision-Date: 2010-04-10 22:46+0200\\n\"" << endl;
        wyjsc << "\"Last-Translator: lmviii <burak326@o2.pl>\\n\"" << endl;
        wyjsc << "\"Language-Team: polish <t>\\n\"" << endl;
        wyjsc << "\"MIME-Version: 1.0\\n\"" << endl;
        wyjsc << "\"Content-Type: text/plain; charset=utf-8\\n\"" << endl;
        wyjsc << "\"Content-Transfer-Encoding: utf-8\\n\"" << endl << endl;


/////////////////////////////////////////////////// Czytanie treści ////////////////////////////////////////////////////



//////////////////////////////////////////////// Plik oryginalny ////////////////////////////////////////

        while (!Strm.eof())
        {
            findAiOutput (Strm,Znak,linia,lout,looth,losel,Ldialog,Tdialogi,0); //Szukanie polecenia AI_Output
            findAddChoice (Strm,Znak,linia,laddc,Laopcdial,Tdopcjadial,0);      //Szukanie polecenia Info_AddChoice
            findLogEntry (Strm,Znak,Tlog,linia,llog,Llog,0);                    //Szukanie Logów
            findDialoge (Strm,Znak,linia,ldesc,Lopcdial,Topcjadial,0); //Szukanie opcji wyboru dialogu

//////////////////////////////////////////////////Przypisywanie wartości /////////////////////////////////

            if (Znak == '\n') linia++;
            if (Tdialogi[3] != "")
            {
                Ttdialogi[lliwiersz][lipol][0] = liwiersz;
                Ttdialogi[lliwiersz][lipol][1] = Tdialogi[0];
                Ttdialogi[lliwiersz][lipol][2] = Tdialogi[1];
                Ttdialogi[lliwiersz][lipol][3] = Tdialogi[2];
                Ttdialogi[lliwiersz][lipol][4] = Tdialogi[3];

                Tdialogi[3] = "";
                lipol++;
            }

//////////////////////////////////////////////////////////

            if (Tdopcjadial[2] != "")
            {
                Ttdialogi[lliwiersz][lipol][0] = liwiersz;
                Ttdialogi[lliwiersz][lipol][1] = Tdopcjadial[0];
                Ttdialogi[lliwiersz][lipol][2] = Tdopcjadial[1];
                Ttdialogi[lliwiersz][lipol][3] = "";
                Ttdialogi[lliwiersz][lipol][4] = Tdopcjadial[2];

                Tdopcjadial[2] = "";
                lipol++;
            }

/////////////////////////////////////////////////////////

            if (Tlog[2] != "")
            {
                Ttdialogi[lliwiersz][lipol][0] = liwiersz;
                Ttdialogi[lliwiersz][lipol][1] = Tlog[0];
                Ttdialogi[lliwiersz][lipol][2] = Tlog[1];
                Ttdialogi[lliwiersz][lipol][3] = "";
                Ttdialogi[lliwiersz][lipol][4] = Tlog[2];

                Tlog[2] = "";
                lipol++;
            }

////////////////////////////////////////////////////////

            if (Topcjadial[2] != "")
            {
                Ttdialogi[lliwiersz][lipol][0] = liwiersz;
                Ttdialogi[lliwiersz][lipol][1] = Topcjadial[0];
                Ttdialogi[lliwiersz][lipol][2] = Topcjadial[1];
                Ttdialogi[lliwiersz][lipol][3] = "";
                Ttdialogi[lliwiersz][lipol][4] = Topcjadial[2];

                Topcjadial[2] = "";
                lipol++;
            }
            Strm >> Znak;
        }

//////////////////////////////////////////////////// Plik z tłumaczeniami //////////////////////////////////////



    if (blokada ==1)
    {
        lipol=0;
        while (!zplik2.eof())
        {
            findAiOutput (zplik2,Znak2,linia,lout,looth,losel,Ldialog,Tdialogi,2); //Szukanie polecenia AI_Output
            findAddChoice (zplik2,Znak2,linia,laddc,Laopcdial,Tdopcjadial,2);      //Szukanie polecenia Info_AddChoice
            findLogEntry (zplik2,Znak2,Tlog,linia,llog,Llog,2);                    //Szukanie Logów
            findDialoge (zplik2,Znak2,linia,ldesc,Lopcdial,Topcjadial,2);          //Szukanie opcji wyboru dialogu.

//////////////////////////////////////////////////Przypisywanie wartości /////////////////////////////////

        if (Tdialogi[4]!="")
        {
            Ttdialogi[lliwiersz][lipol][5] = Tdialogi[4];
            Tdialogi[4] = "";
            lipol++;
        }

//////////////////////////////////////////////////////////

        if (Tdopcjadial[3]!="")
        {
            Ttdialogi[lliwiersz][lipol][5] = Tdopcjadial[3];
            Tdopcjadial[3] = "";
            lipol++;

        }

/////////////////////////////////////////////////////////

        if (Tlog[3]!="")
        {
            Ttdialogi[lliwiersz][lipol][5] = Tlog[3];
            Tlog[3] = "";
            lipol++;
        }

////////////////////////////////////////////////////////

        if (Topcjadial[3]!="")
        {
            Ttdialogi[lliwiersz][lipol][5] = Topcjadial[3];
            Topcjadial[3] = "";
            lipol++;
        }

        zplik2 >> Znak2;
        }//Koniec pliku

    }//Koniec blokady



////////////////////////////////////////////////// Statystyki pliku ///////////////////////////////////

    Tilosc[lliwiersz]=Ldialog+Lopcdial+Laopcdial+Llog;
    cout << endl;
    cout << "Statystyki" << endl;
    cout << "Opcje wyboru: "<< ldesc << "/" << Lopcdial << endl;
    cout << "Dialogi: " << lout << "/" << Ldialog <<" w tym " << "Bohatera: " << looth << " " << "Rozmówcy: " << losel << endl;
    cout << "Dynamiczne opcje wyboru: " << laddc << "/" << Laopcdial << endl;
    cout << "Dzienniki: " << llog << "/" << Llog <<endl;
    cout << "Linii: " << linia<<endl;

////////////////////////////////////////////////// Zerowanie zmiennych /////////////////////////////////

    ldesc=0;         //Licznik opcji dialogowych.
    Lopcdial=0;      //Licznik opcji dialogowych.
    lout=0;          //Licznik dialogów.
    Ldialog=0;       //Licznik dialogów.
    looth=0;         //Licznik dialogów bohatera.
    losel=0;         //Licznik dialogów rozmówcy.
    laddc=0;         //Licznik dynamicznych opcji dialogowych.
    Laopcdial=0;     //Licznik dynamicznych opcji dialogowych.
    llog=0;          //Licznik logów dziennika.
    Llog=0;          //Licznik logów dziennika.
    linia=0;         //Licznik linii.

////////////////////////////////////////////////// Zapis do pliku //////////////////////////////////////

    int p2;
    p2=0;
    while (p2<Tilosc[lliwiersz])
    {

        wyjsc << "# " << Ttdialogi[lliwiersz][p2][2] << " " << Ttdialogi[lliwiersz][p2][3] << endl;
        wyjsc << "#: " << Ttdialogi[lliwiersz][p2][0] << ":" << Ttdialogi[lliwiersz][p2][1] << endl;
        //if (Ttdialogi[lliwiersz][p2][3]=="self") wyjsc << "msgid \"" << "Rozmówca: " << Ttdialogi[lliwiersz][p2][4] << "\"" << endl;
        //else if (Ttdialogi[lliwiersz][p2][3]=="other") wyjsc << "msgid \"" << "Bohater: " << Ttdialogi[lliwiersz][p2][4] << "\"" << endl;
        wyjsc << "msgid \"" << Ttdialogi[lliwiersz][p2][4] << "\"" << endl;
        if (blokada==0) wyjsc << "msgstr \"\"" << endl <<endl;
        else if (blokada==1) wyjsc << "msgstr \"" << Ttdialogi[lliwiersz][p2][5] << "\"" << endl <<endl;
        p2++;
    }

//    }
Strm.close( );
zplik2.close();
wyjsc.close();

liwiersz="";
lipol=0;
lista >> Znak;
}
//for (int p1=0, p2=0; p1<prelliwiersz; )
//{
//    p1++;
//    cout << prelliwiersz<<endl;
//    cout << p1 << " " << p2 << endl;
//    cout << Tilosc[p1]<<endl;
//    string fuck =
//    wyjsc.open(wynik[p1], ios::out);

    //cout<< Ttdialogi[p1][p2][0];

    //p1++;
//}

lista.close();
   }
